package com.example.demo3.handler;

import com.example.demo3.entity.User;
import com.example.demo3.util.CryptService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class UserResultHandler implements ResultHandler<User> {

    /**
     * 这里每集满1000条数据 往硬盘的excel文件中追加一次数据
     */
    private static final int BATCH_SIZE = 1000;

    /**
     * 计数器
     */
    private int size = 0;

    private CryptService cryptService;

    /**
     * 存储每批数据的临时容器
     */
    private List<User> userList = new ArrayList<>();

    public UserResultHandler(CryptService cryptService) {
        this.cryptService = cryptService;
    }

    @Override
    public void handleResult(ResultContext<? extends User> resultContext) {
        User user = resultContext.getResultObject();
        cryptService.decrypt(user);
        userList.add(user);
        size++;
        if (size == BATCH_SIZE) {
            // 如果集满1000条就往文件中写一次z
            handle();
        }
    }

    /**
     * 集满1000条 执行一次的逻辑
     */
    private void handle() {
        try {
            // 在这里可以对你获取到的批量结果数据进行需要的业务处理
            // 这里的业务是 往文件中写一次
            log.info("userList:[{}]", userList);
        } finally {
            // 处理完每批数据后后将临时清空
            size = 0;
            userList.clear();
        }
    }

    /**
     * 这个方法给外面调用，用来完成最后一批数据处理
     */
    public void end() {
        handle();// 处理最后一批不到BATCH_SIZE的数据
    }

}
